// 引入已初始化的模型和相关依赖
const { users } = require('../models/init-models')(require('../db').sequelize, require('sequelize').DataTypes)
const bcrypt = require('bcryptjs')
const jwt = require('jsonwebtoken')
const { validationResult } = require('express-validator')
const config = require('../config')

// 注册用户的处理函数
const regUser = async (req, res) => {
    try {
        // 检查验证结果
        const errors = validationResult(req)
        if (!errors.isEmpty()) {
            return res.status(400).json({
                status: 1,
                message: '数据验证失败',
                errors: errors.array()
            })
        }

        const { username, password } = req.body

        // 检查用户名是否已存在
        const existingUser = await users.findOne({ where: { username } })
        if (existingUser) {
            return res.error('用户名已被占用，请更换其他用户名', 1, 400)
        }

        // 对密码进行加密
        const saltRounds = 10
        const hashedPassword = await bcrypt.hash(password, saltRounds)

        // 创建新用户
        const newUser = await users.create({
            username,
            password: hashedPassword
        })

        res.success(null, '注册成功')
    } catch (err) {
        console.error('注册用户失败:', err)
        res.error('注册用户失败，请稍后再试')
    }
}

// 登录的处理函数  
const login = async (req, res) => {
    try {
        // 检查验证结果
        const errors = validationResult(req)
        if (!errors.isEmpty()) {
            return res.status(400).json({
                status: 1,
                message: '数据验证失败',
                errors: errors.array()
            })
        }

        const { username, password } = req.body

        // 查找用户
        const user = await users.findOne({ where: { username } })
        if (!user) {
            return res.error('登录失败，用户名不存在', 1, 400)
        }

        // 验证密码
        const isPasswordValid = await bcrypt.compare(password, user.password)
        if (!isPasswordValid) {
            return res.error('登录失败，密码错误', 1, 400)
        }

        // 生成 JWT token
        const userForToken = {
            user_id: user.user_id,
            username: user.username
        }

        const token = jwt.sign(userForToken, config.jwtSecretKey, {
            expiresIn: '24h',
            issuer: 'api-server',
            subject: user.user_id.toString()
        })

        res.success({ token: 'Bearer ' + token }, '登录成功')
    } catch (err) {
        console.error('登录失败:', err)
        res.error('登录失败，请稍后再试')
    }
}

module.exports = {
    regUser,
    login
}